package karaoke.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import karaoke.excepcion.DAOExcepcion;
import karaoke.modelo.Cliente;
import karaoke.util.ConexionBD;

public class ClienteDAO extends BaseDAO{

	public Collection<Cliente> buscarPorNombre(String nombre)
			throws DAOExcepcion {
		System.out.println("ClienteDAO: buscarPorNombre(String cliente_nombre)");
		String query = "select cliente_Id, cliente_tipo, cliente_num, cliente_nombre, cliente_ape_paterno, "
				+ "cliente_ape_materno, cliente_correo, cliente_pass from tb_cliente where cliente_nombre like ?";
		Collection<Cliente> lista = new ArrayList<Cliente>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + nombre + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Cliente vo = new Cliente();
				vo.setCliente_Id(rs.getInt("cliente_Id"));
				vo.setCliente_Tipo(rs.getString("cliente_tipo"));
				vo.setCliente_Num(rs.getInt("cliente_num"));
				vo.setCliente_Nombre(rs.getString("cliente_nombre"));
				vo.setCliente_ApePat(rs.getString("cliente_ape_paterno"));
				vo.setCliente_ApeMat(rs.getString("cliente_ape_materno"));
				vo.setCliente_Correo(rs.getString("cliente_correo"));
				vo.setCliente_Pass(rs.getString("cliente_pass"));
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		System.out.println(lista.size());
		return lista;
	}
	
	
	public Cliente insertar(Cliente vo) throws DAOExcepcion {
		String query = "insert into tb_cliente(cliente_tipo, cliente_num, cliente_nombre, "
				+ "cliente_ape_paterno, cliente_ape_materno, cliente_correo, cliente_pass) values (?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getCliente_Tipo());
			stmt.setInt(2, vo.getCliente_Num());
			stmt.setString(3, vo.getCliente_Nombre());
			stmt.setString(4, vo.getCliente_ApePat());
			stmt.setString(5, vo.getCliente_ApeMat());
			stmt.setString(6, vo.getCliente_Correo());
			stmt.setString(7, vo.getCliente_Pass());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			/*
			 * // Obtener el ultimo id int id = 0; query =
			 * "select last_insert_id()"; stmt = con.prepareStatement(query); rs
			 * = stmt.executeQuery(); if (rs.next()) { id = rs.getInt(1); }
			 * vo.setLocal_Id(id);
			 */
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public void eliminar(int cliente_Id) throws DAOExcepcion {
		String query = "delete from tb_cliente WHERE cliente_Id=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, cliente_Id);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Cliente obtener(int cliente_Id) throws DAOExcepcion {
		Cliente vo = new Cliente();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select cliente_Id, cliente_tipo, cliente_num, cliente_nombre, "
				+ "cliente_ape_paterno, cliente_ape_materno, cliente_correo, cliente_pass from tb_cliente where cliente_Id=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, cliente_Id);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setCliente_Id(rs.getInt(1));
				vo.setCliente_Tipo(rs.getString(2));
				vo.setCliente_Num(rs.getInt(3));
				vo.setCliente_Nombre(rs.getString(4));
				vo.setCliente_ApePat(rs.getString(5));
				vo.setCliente_ApeMat(rs.getString(6));
				vo.setCliente_Correo(rs.getString(7));
				vo.setCliente_Pass(rs.getString(8));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	public Collection<Cliente> listar() throws DAOExcepcion {
		Collection<Cliente> c = new ArrayList<Cliente>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select cliente_Id, cliente_tipo, cliente_num, cliente_nombre, cliente_ape_paterno, "
					+ "cliente_ape_materno, cliente_correo, cliente_pass from tb_cliente order by cliente_nombre";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Cliente vo = new Cliente();
				vo.setCliente_Id(rs.getInt("cliente_Id"));
				vo.setCliente_Tipo(rs.getString("cliente_tipo"));
				vo.setCliente_Num(rs.getInt("cliente_num"));
				vo.setCliente_Nombre(rs.getString("cliente_nombre"));
				vo.setCliente_ApePat(rs.getString("cliente_ape_paterno"));
				vo.setCliente_ApeMat(rs.getString("cliente_ape_materno"));
				vo.setCliente_Correo(rs.getString("cliente_correo"));
				vo.setCliente_Pass(rs.getString("cliente_pass"));
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

	
	public Cliente actualizar(Cliente vo) throws DAOExcepcion {
		String query = "update tb_cliente set cliente_tipo=?, cliente_num=?, cliente_nombre=?, cliente_ape_paterno=?, cliente_ape_materno=?, cliente_correo=?, cliente_pass=? where cliente_Id=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getCliente_Tipo());
			stmt.setInt(2, vo.getCliente_Num());
			stmt.setString(3, vo.getCliente_Nombre());
			stmt.setString(4, vo.getCliente_ApePat());
			stmt.setString(5, vo.getCliente_ApeMat());
			stmt.setString(6, vo.getCliente_Correo());
			stmt.setString(7, vo.getCliente_Pass());
			stmt.setInt(8,vo.getCliente_Id());
		
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
}
